
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>消息模型与交换机类型 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>消息模型与交换机类型 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在RabbitMQ中，交换机（Exchange）的核心作用是什么？文档中提到了哪四种主要类型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">交换机（Exchange）的核心作用是决定消息应该被路由到哪个队列。它负责接收来自生产者的消息，并根据其类型和绑定规则，将消息路由到一个或多个合适的队列。文档中提到的四种主要类型是：Direct Exchange、Fanout Exchange、Topic Exchange 和 Headers Exchange。</div>
          </div>
          <div class="card-source">来源: 消息模型与交换机类型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Direct Exchange（直接交换机）是如何根据路由键（routing key）来投递消息的？如果消息的路由键没有匹配到任何队列绑定，会发生什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Direct Exchange 根据消息的路由键与队列的绑定键进行精确匹配。只有当消息的路由键与队列的绑定键完全相同时，消息才会被路由到该队列。如果没有找到匹配的队列，消息将被丢弃。</div>
          </div>
          <div class="card-source">来源: Direct Exchange（直接交换机） - 1. Direct Exchange 的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Fanout Exchange（扇形交换机）最显著的特性是什么？它的路由决策是否依赖于消息的路由键？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Fanout Exchange 最显著的特性是其广播性质。它会将所有传入的消息广播到所有与其绑定的队列中。它的路由决策不依赖于消息的路由键，会忽略路由键进行无条件广播。</div>
          </div>
          <div class="card-source">来源: Fanout Exchange（扇出交换机） - 2. Fanout Exchange 的特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Topic Exchange（主题交换机）使用了哪两种通配符进行模式匹配？请分别解释它们的含义。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Topic Exchange 使用了两种通配符进行模式匹配：星号（*）和井号（#）。其中，'*' 用于匹配一个单词（由点号分隔的部分），而 '#' 用于匹配零个或多个单词。</div>
          </div>
          <div class="card-source">来源: Topic Exchange（主题交换机） - 1. Topic Exchange 的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Headers Exchange（头交换机）的路由机制与其他三种交换机有何根本不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Headers Exchange 的根本不同之处在于它不使用路由键（routing key）来路由消息，而是根据消息的 header（头部信息）中的键值对来决定消息的路由目标。</div>
          </div>
          <div class="card-source">来源: Headers Exchange（头交换机）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在什么场景下应优先选择使用 Fanout Exchange？请举一个例子。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当需要将同一条消息广播给所有订阅者或多个消费者时，应优先选择 Fanout Exchange。例如，在实时系统中发布系统更新或升级通知，所有消费者都需要接收到这条通知。</div>
          </div>
          <div class="card-source">来源: 交换机类型的应用场景分析 - 2. Fanout Exchange（广播交换机）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在RabbitMQ中，“绑定（Binding）”指的是什么？它在消息路由中扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“绑定”是指将一个队列与一个交换机通过特定的路由规则连接起来的关系。它在消息路由中扮演核心角色，定义了交换机如何以及根据什么规则（如路由键）将消息传递给队列。</div>
          </div>
          <div class="card-source">来源: 交换机与队列的绑定 - 绑定的基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当使用 Headers Exchange 时，`x-match` 属性的作用是什么？它有哪些可选值及其含义？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`x-match` 属性用于控制队列绑定时头部字段的匹配规则。它有两个可选值：'all'，表示消息头部中的所有键值对必须与队列绑定的键值对完全匹配；'any'，表示消息头部中只要有一个键值对匹配队列绑定的键值对即可。</div>
          </div>
          <div class="card-source">来源: Headers Exchange（头交换机） - 工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">假设一个日志系统需要根据日志来源（如'app'、'db'）和级别（如'info'、'error'）进行灵活订阅，哪种交换机最适合这种多层次分类的场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Topic Exchange 最适合这种场景。它可以通过路由键的模式匹配（例如使用 'app.info'、'db.error' 等路由键，并用 'app.*' 或 '*.error' 等模式进行订阅）来灵活地路由消息，满足多层次分类的需求。</div>
          </div>
          <div class="card-source">来源: 交换机类型的应用场景分析 - 3. Topic Exchange（主题交换机）</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
